/**
 ******************************************************************************
 * @file           : bsp_dac.h
 * @brief          : DAC Driver Header File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * DAC驱动程序头文件
 * 支持双通道DAC输出
 * 支持电压输出和波形生成
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_DAC_H
#define __BSP_DAC_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief DAC错误码枚举
 */
typedef enum
{
    DAC_OK = 0,                 /*!< 成功 */
    DAC_ERROR_PARAM,            /*!< 参数错误 */
    DAC_ERROR_HAL,              /*!< HAL库错误 */
    DAC_ERROR_NOT_INITIALIZED   /*!< 未初始化 */
} DAC_Error_e;

/**
 * @brief DAC通道枚举
 */
typedef enum
{
    DAC_CH_1 = 1,               /*!< DAC通道1 */
    DAC_CH_2 = 2                /*!< DAC通道2 */
} DAC_Channel_e;

/**
 * @brief DAC状态枚举
 */
typedef enum
{
    DAC_STATE_IDLE = 0,         /*!< 空闲状态 */
    DAC_STATE_BUSY,             /*!< 忙状态 */
    DAC_STATE_OUTPUTTING        /*!< 输出中 */
} DAC_State_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
DAC_Error_e dac_init(void);                                                     /* DAC初始化 */
DAC_Error_e dac_deinit(void);                                                   /* DAC反初始化 */

/* 输出控制函数 */
DAC_Error_e dac_set_value(DAC_Channel_e channel, uint16_t value);               /* 设置DAC输出值 */
DAC_Error_e dac_set_voltage(DAC_Channel_e channel, float voltage);              /* 设置DAC输出电压 */
DAC_Error_e dac_enable(DAC_Channel_e channel);                                  /* 使能DAC输出 */
DAC_Error_e dac_disable(DAC_Channel_e channel);                                 /* 禁用DAC输出 */

/* 波形生成函数 */
DAC_Error_e dac_output_triangle(DAC_Channel_e channel, uint16_t amplitude);     /* 输出三角波 */
DAC_Error_e dac_output_noise(DAC_Channel_e channel);                            /* 输出噪声 */

/* 状态查询函数 */
DAC_State_e dac_get_state(void);                                                /* 获取DAC状态 */

/* 调试接口 */
void dac_print_status(void);                                                    /* 打印DAC状态 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_DAC_H */
